home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / x11 / strategy / xbomb-2.0 / xbomb-2 / xbomb / hiscore.c < prev    next >
C/C++ Source or Header  |  1995-11-16  |  5KB  |  236 lines

  1. /***************************************
  2.   $Header: /home/amb/xbomb/RCS/hiscore.c 1.7 1995/11/16 20:16:23 amb Exp $
  3.  
  4.   XBomb - 'Minesweeper' game - Version 2
  5.  
  6.   Hi-score table management.
  7.  
  8.   Written by Andrew M. Bishop
  9.  
  10.   This file Copyright 1994 1995 Andrew M. Bishop
  11.   It may be distributed under the GNU Public License, version 2, or
  12.   any higher version.  See section COPYING of the GNU Public license
  13.   for conditions under which this file may be redistributed.
  14.   ***************************************/
  15.  
  16.  
  17. #include <stdio.h>
  18. #include <stdlib.h>
  19. #include <sys/stat.h>
  20. #include <unistd.h>
  21. #include <time.h>
  22. #include "xbomb.h"
  23.  
  24. #if defined(__sun__) && !defined(__svr4__)
  25. int    fprintf(FILE*, const char*,...);
  26. int    printf(const char*, ... );
  27. int    sscanf(char*, const char*,...);
  28. int    fread(void*,unsigned int,unsigned int, FILE*);
  29. int    fwrite(const void*,unsigned int,unsigned int, FILE*);
  30. int    fclose(FILE*);
  31. long   time(long*);
  32. #endif
  33.  
  34. extern int grid_type;
  35. extern char levels[NLEVELS][LEVELSLEN],types[NTYPES][TYPESLEN];
  36. extern int widths[NLEVELS],heights[NLEVELS],nbombs[NLEVELS];
  37.  
  38. static char filenames[NTYPES][FILENAMELEN]=HIGH_SCORE_FILENAMES;
  39. static char pos[10][5]={"Top","2nd","3rd","4th","5th","6th","7th","8th","9th","10th"};
  40. static int  score[NLEVELS][10];
  41. static char name[NLEVELS][10][20];
  42. static long date[NLEVELS][10];
  43.  
  44. struct score_name {int score;char name[20];long date;};
  45.  
  46. static void decrypt_score(struct score_name* sn);
  47. static void encrypt_score(struct score_name* sn);
  48.  
  49. /*++++++++++++++++++++++++++++++++++++++
  50.   Load in the high score table.
  51.   ++++++++++++++++++++++++++++++++++++++*/
  52.  
  53. void LoadHighScores()
  54. {
  55.  FILE *f;
  56.  int i,j;
  57.  struct score_name sn;
  58.  
  59.  for(i=0;i<NLEVELS;i++)
  60.     for(j=0;j<10;j++)
  61.       {
  62.        score[i][j]=9999999;
  63.        strcpy(name[i][j],"nobody");
  64.        date[i][j]=0;
  65.       }
  66.  
  67.  f=fopen(filenames[grid_type-GAME_TYPE],"r");
  68.  
  69.  if(!f)
  70.    {
  71.     fprintf(stderr,"\nXBomb: Cannot open high score table '%s'\n",filenames[grid_type-GAME_TYPE]);
  72.     return;
  73.    }
  74.  
  75.  for(i=0;i<NLEVELS;i++)
  76.     for(j=0;j<10;j++)
  77.       {
  78.        if(!fread(&sn,sizeof(sn),1,f))
  79.           break;
  80.        decrypt_score(&sn);
  81.        score[i][j]=sn.score;
  82.        strcpy(name[i][j],sn.name);
  83.        date[i][j]=sn.date;
  84.       }
  85.  
  86.  fclose(f);
  87. }
  88.  
  89.  
  90. /*++++++++++++++++++++++++++++++++++++++
  91.   Saves the high score table.
  92.   ++++++++++++++++++++++++++++++++++++++*/
  93.  
  94. void SaveHighScores()
  95. {
  96.  FILE *f;
  97.  int i,j;
  98.  struct score_name sn;
  99.  
  100.  f=fopen(filenames[grid_type-GAME_TYPE],"w");
  101.  
  102.  if(!f)
  103.    {
  104.     fprintf(stderr,"\nXBomb: Cannot open high score table '%s'\n",filenames[grid_type-GAME_TYPE]);
  105.     return;
  106.    }
  107.  
  108.  for(i=0;i<NLEVELS;i++)
  109.     for(j=0;j<10;j++)
  110.       {
  111.        sn.score=score[i][j];
  112.        strcpy(sn.name,name[i][j]);
  113.        sn.date=date[i][j];
  114.        encrypt_score(&sn);
  115.        fwrite(&sn,sizeof(sn),1,f);
  116.       }
  117.  
  118.  fclose(f);
  119.  
  120.  chmod(filenames[grid_type-GAME_TYPE],S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);
  121. }
  122.  
  123.  
  124. /*++++++++++++++++++++++++++++++++++++++
  125.   Prints the high score tables.
  126.  
  127.   int level The level to print the scores for.
  128.   ++++++++++++++++++++++++++++++++++++++*/
  129.  
  130. void PrintHighScores(int level)
  131. {
  132.  int l,j;
  133.  
  134.  LoadHighScores();
  135.  
  136.  if(level==-1)
  137.     printf("\nHigh score tables for %s\n",types[grid_type-GAME_TYPE]);
  138.  
  139.  for(l=(level==-1?0:level);l<(level==-1?NLEVELS:level+1);l++)
  140.    {
  141.     printf("\nHigh scores for %s level (%dx%d grid of %s with %d bombs)\n",levels[l],widths[l],heights[l],types[grid_type-GAME_TYPE],nbombs[l]);
  142.     for(j=0;j<10;j++)
  143.       {
  144.        printf("%4s : %12s = ",pos[j],name[l][j]);
  145.        if(!date[l][j])
  146.           printf("  SLOW");
  147.        else if(l==0)
  148.           printf("%6.2f",(double)score[l][j]/1000.0);
  149.        else if(l==1)
  150.           printf("%6.1f",(double)score[l][j]/1000.0);
  151.        else
  152.           printf("%6.0f",(double)score[l][j]/1000.0);
  153.        if(date[l][j])
  154.           printf(" : %s",ctime(&date[l][j]));
  155.        else
  156.          {printf(" : Never\n");break;}
  157.       }
  158.     printf("\n");
  159.    }
  160. }
  161.  
  162.  
  163. /*++++++++++++++++++++++++++++++++++++++
  164.   Adds a high score to the table if it is good enough.
  165.  
  166.   int level The level that has been completed.
  167.  
  168.   int ticks The time that was taken.
  169.   ++++++++++++++++++++++++++++++++++++++*/
  170.  
  171. void AddHighScore(int level,int ticks)
  172. {
  173.  int j;
  174.  int changed=-1;
  175.  
  176.  LoadHighScores();
  177.  
  178.  for(j=0;j<10;j++)
  179.     if(ticks<score[level][j])
  180.        {changed=j;break;}
  181.  
  182.  if(changed!=-1)
  183.    {
  184.     for(j=9;j>changed;j--)
  185.       {
  186.        score[level][j]=score[level][j-1];
  187.        strcpy(name[level][j],name[level][j-1]);
  188.        date[level][j]=date[level][j-1];
  189.       }
  190.     score[level][changed]=ticks;
  191.     cuserid(name[level][changed]);
  192.     date[level][changed]=time(&date[level][changed]);
  193.     SaveHighScores();
  194.    }
  195.  else
  196.     printf("Sorry not good enough.\n");
  197.  
  198.  PrintHighScores(level);
  199. }
  200.  
  201.  
  202. /*++++++++++++++++++++++++++++++++++++++
  203.   Decrypts the high score table
  204.  
  205.   struct score_name* sn The score and name to decrypt.
  206.   ++++++++++++++++++++++++++++++++++++++*/
  207.  
  208. static void decrypt_score(struct score_name* sn)
  209. {
  210.  int i;
  211.  char *p=(char*)sn;
  212.  
  213.  for(i=0;i<sizeof(struct score_name);i++)
  214.     p[i]^=125;
  215.  
  216.  return;
  217. }
  218.  
  219.  
  220. /*++++++++++++++++++++++++++++++++++++++
  221.   Encrypts the high score table
  222.  
  223.   struct score_name* sn The score and name to encrypt.
  224.   ++++++++++++++++++++++++++++++++++++++*/
  225.  
  226. static void encrypt_score(struct score_name* sn)
  227. {
  228.  int i;
  229.  char *p=(char*)sn;
  230.  
  231.  for(i=0;i<sizeof(struct score_name);i++)
  232.     p[i]^=125;
  233.  
  234.  return;
  235. }
  236.